import csv
from collections import defaultdict
import os
import pandas as pd

"""
读取一个.csv有多少行
"""
def count_csv_rows(csv_file):
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        row_count = sum(1 for row in reader)
    return row_count


"""
从一个大的csv文件中获得小的csv文件
这个的原理是按照人每个人取固定的数量
这个适用于360以外的
"""
def get_samllcsv(input_file_path, output_file_path, max_person):
    # 用于存储每个人的图片行数据
    image_groups = defaultdict(list)

    # 第一步：读取CSV文件，按人分组图片路径（包括所有列）
    with open(input_file_path, 'r', newline='', encoding='utf-8') as input_file:
        reader = csv.reader(input_file)
        for row in reader:
            if row:  # 确保非空行
                image_path = row[0].replace("\\", "/")  # 第一列是图片路径
                # 获取图片的目录名(即p1,p2等)
                person = os.path.dirname(image_path)
                # 将包含所有列的行按人分组
                image_groups[person].append(row)

    # 第二步：根据每个人的图片总数，按照规则挑选200张图片
    selected_rows = []

    for person, rows in image_groups.items():
        total_images = len(rows)
        print(f"当前人 {person} 图片数量 {total_images}")
        if total_images <= max_person:
            # 如果图片总数不足200，选取全部行数据
            selected_rows.extend(rows)
        else:
            # 计算图片间隔，均匀挑选200张
            interval = total_images // max_person
            print(interval)
            selected_rows.extend(rows[i] for i in range(0, total_images, interval)[:max_person])

    # 第三步：将选取的整行数据写入新的CSV文件
    with open(output_file_path, 'w', newline='', encoding='utf-8') as output_file:
        writer = csv.writer(output_file)
        # 写入选中的所有行（包括所有列）
        writer.writerows(selected_rows)


"""
从一个大的csv文件中获得小的csv文件
这个适用于360
这个既有随即选取，又有均匀选取
"""
def get_samllcsv_1(input_file_path, output_file_path, total_count):
    print(111)
    df = pd.read_csv(input_file_path)
    total_rows = len(df)
    # 从中随机选取12000行
    selected_rows = df.sample(n=total_count, random_state=42)
    # step = int(total_rows / total_count)
    # print(step)
    # 均匀选取行
    # selected_indices = list(range(0, total_rows, step))[:total_count]
    # selected_rows = df.iloc[selected_indices]
    # 将选取的行保存到一个新的CSV文件
    selected_rows.to_csv(output_file_path, index=False)


def add_face(input_file_path, output_file_path):
    """
    因为我的360和mpii是之前获得的，他第一列我不知道怎么把face给弄掉了
    所以这里就读取原来的csv文件，然后修改第一列加一个/face
    """
    df = pd.read_csv(input_file_path, header=None)
    df[0] = df[0].apply(lambda x: x.replace('\\', '/Face/'))
    df.to_csv(output_file_path, index=False, header=False)

def remove_face(input_file_path, output_file_path):
    """
    因为我的360和mpii是之前获得的，他第一列我不知道怎么把face给弄掉了
    所以这里就读取原来的csv文件，然后修改第一列加一个/face
    """
    df = pd.read_csv(input_file_path, header=None)
    df[0] = df[0].apply(lambda x: x.replace('\\Face\\', '\\'))
    df.to_csv(output_file_path, index=False, header=False)
def csv_to_label(csv_file, label_file, num_eyediap):
    """
    将.csv文件转化为.label文件
    """
    with open(csv_file, 'r') as csvfile:
        csv_reader = csv.reader(csvfile)
        with open(label_file, 'w') as labelfile:
            for row in csv_reader:
                label_line = " ".join(row[:num_eyediap]) + "\n"
                labelfile.write(label_line)


if __name__ == "__main__":
    # print(1111)
    # # count_csv_rows函数的调用
    # csv_file = '/home/xian/mzs/mzs_code/Dataset/ETH/eth_all_selected.csv'
    # num_rows = count_csv_rows(csv_file)
    # print(f"CSV文件的行数是: {num_rows}")

    # print(2222)
    # # 读取并写入 CSV 文件的路径
    # input_file_path = '/home/xian/mzs/mzs_code/Dataset/diap_6400/label/all_noselect.csv'
    # output_file_path = '/home/xian/mzs/mzs_code/Dataset/diap_6400/label/500_diap.csv'
    # # 每个人挑选的图片数量
    # max_person = 30
    # get_samllcsv(input_file_path, output_file_path, max_person)

    # print(333)
    # input_file_path = '/home/xian/mzs/mzs_code/Dataset/ETH/eth_all_selected.csv'
    # output_file_path = '/home/xian/mzs/mzs_code/Dataset/ETH/few_eth.csv'
    # total_count = 100000
    # get_samllcsv_1(input_file_path, output_file_path, total_count)

    print(444)
    input_file_path = '/home/xian/mzs/mzs_code/Dataset/360/all_noselect_360_2025.csv'
    output_file_path = '/home/xian/mzs/mzs_code/Dataset/360/1.csv'
    remove_face(input_file_path, output_file_path)

    # print(555)
    # csv_file = 'path/to/your/input.csv'
    # label_file = 'path/to/your/output.label'
    # num_eyediap = 12  # 根据具体情况调整
    #
    # csv_to_label(csv_file, label_file, num_eyediap)
